The example below shows how to resolve a data type. The main work is done by the ResolveDataType Method.
// Shows how to obtain object describing the data type of complex data node with OPC UA Complex Data plug-in. // // Find all latest examples here: https://opclabs.doc-that.com/files/onlinedocs/OPCLabs-OpcStudio/Latest/examples.html . // OPC client and subscriber examples in C# on GitHub: https://github.com/OPCLabs/Examples-QuickOPC-CSharp . // Missing some example? Ask us for it on our Online Forums, https://www.opclabs.com/forum/index ! You do not have to own // a commercial license in order to use Online Forums, and we reply to every post. using System; using Microsoft.Extensions.DependencyInjection; using OpcLabs.BaseLib.DataTypeModel; using OpcLabs.BaseLib.OperationModel.Generic; using OpcLabs.EasyOpc.UA; using OpcLabs.EasyOpc.UA.AddressSpace; using OpcLabs.EasyOpc.UA.AddressSpace.Standard; using OpcLabs.EasyOpc.UA.InformationModel; using OpcLabs.EasyOpc.UA.Plugins.ComplexData; namespace UADocExamples.ComplexData._IEasyUAClientComplexData { class ResolveDataType { public static void Main1() { // Define which server we will work with. UAEndpointDescriptor endpointDescriptor = "opc.tcp://opcua.demo-this.com:51210/UA/SampleServer"; // or "http://opcua.demo-this.com:51211/UA/SampleServer" (currently not supported) // or "https://opcua.demo-this.com:51212/UA/SampleServer/" // Instantiate the client object. var client = new EasyUAClient(); // Obtain the data type ID. // // In many cases, you would be able to obtain the data type ID of a particular node by reading its DataType // attribute, or easier, by calling the extension method ReadDataType on the IEasyUAClient interface. // The sample server, however, shows a more advanced approach in which the data type ID refers to an abstract // data type, and the actual values are then sub-types of this base data type. This abstract data type does not // have any encodings associated with it and it is therefore not possible to extract its description from the // server. We therefore use a hard-coded data type ID for one of the sub-types in this example. // // The code to obtain the data type ID for given node would normally look like this: // UANodeId dataTypeId = client.ReadDataType( // endpointDescriptor, // "nsu=http://test.org/UA/Data/ ;i=10239"); // [ObjectsFolder]/Data.Static.Scalar.StructureValue // UANodeId dataTypeId = "nsu=http://test.org/UA/Data/ ;i=9440"; // ScalarValueDataType // Get the IEasyUAClientComplexData service from the client. This is needed for advanced complex data // operations. IEasyUAClientComplexData complexData = client.GetService<IEasyUAClientComplexData>(); // Resolve the data type ID to the data type object, containing description of the data type. ValueResult<DataType> dataTypeResult = complexData.ResolveDataType( new UAModelNodeDescriptor(endpointDescriptor, dataTypeId), UABrowseNames.DefaultBinary); // Check if the operation succeeded. Use the ThrowIfFailed method instead if you want exception be thrown. if (!dataTypeResult.Succeeded) { Console.WriteLine("*** Failure: {0}", dataTypeResult.ErrorMessageBrief); return; } // The actual data type is in the Value property. // Display basic information about what we have obtained. Console.WriteLine(dataTypeResult.Value); // If we want to see the whole hierarchy of the received data type, we can format it with the "V" (verbose) // specifier. In the debugger, you can view the same by displaying the private DebugView property. Console.WriteLine(); Console.WriteLine("{0:V}", dataTypeResult.Value); // For processing the internals of the data type, refer to examples for GenericData class. // Example output (truncated): // //ScalarValueDataType = structured // //ScalarValueDataType = structured // [BooleanValue] Boolean = primitive(System.Boolean) // [ByteStringValue] ByteString = primitive(System.Byte[]) // [ByteValue] Byte = primitive(System.Byte) // [DateTimeValue] DateTime = primitive(System.DateTime) // [DoubleValue] Double = primitive(System.Double) // [EnumerationValue] Int32 = primitive(System.Int32) // [ExpandedNodeIdValue] ExpandedNodeId = structured // [ByteString] optional ByteStringNodeId = structured // [Identifier] ByteString = primitive(System.Byte[]) // [NamespaceIndex] UInt16 = primitive(System.UInt16) // [FourByte] optional FourByteNodeId = structured // [Identifier] UInt16 = primitive(System.UInt16) // [NamespaceIndex] Byte = primitive(System.Byte) // [Guid] optional GuidNodeId = structured // [Identifier] Guid = primitive(System.Guid) // [NamespaceIndex] UInt16 = primitive(System.UInt16) // [NamespaceURI] optional CharArray = primitive(System.String) // [NamespaceURISpecified] switch Bit = primitive(System.Boolean) // [NodeIdType] switch NodeIdType = enumeration(6) // TwoByte = 0 // FourByte = 1 // Numeric = 2 // String = 3 // Guid = 4 // ByteString = 5 // [Numeric] optional NumericNodeId = structured // [Identifier] UInt32 = primitive(System.UInt32) // [NamespaceIndex] UInt16 = primitive(System.UInt16) // [ServerIndex] optional UInt32 = primitive(System.UInt32) // [ServerIndexSpecified] switch Bit = primitive(System.Boolean) // [String] optional StringNodeId = structured // [Identifier] CharArray = primitive(System.String) // [NamespaceIndex] UInt16 = primitive(System.UInt16) // [TwoByte] optional TwoByteNodeId = structured // [Identifier] Byte = primitive(System.Byte) // [FloatValue] Float = primitive(System.Single) // [GuidValue] Guid = primitive(System.Guid) // [Int16Value] Int16 = primitive(System.Int16) // [Int32Value] Int32 = primitive(System.Int32) // [Int64Value] Int64 = primitive(System.Int64) // [Integer] Variant = structured // [ArrayDimensions] optional sequence[*] of Int32 = primitive(System.Int32) // [ArrayDimensionsSpecified] switch sequence[1] of Bit = primitive(System.Boolean) // [ArrayLength] length optional Int32 = primitive(System.Int32) // [ArrayLengthSpecified] switch sequence[1] of Bit = primitive(System.Boolean) // [Boolean] optional sequence[*] of Boolean = primitive(System.Boolean) // [Byte] optional sequence[*] of Byte = primitive(System.Byte) } } }
' Shows how to obtain object describing the data type of complex data node with OPC UA Complex Data plug-in. ' ' Find all latest examples here: https://opclabs.doc-that.com/files/onlinedocs/OPCLabs-OpcStudio/Latest/examples.html . ' OPC client and subscriber examples in VB.NET on GitHub: https://github.com/OPCLabs/Examples-QuickOPC-VBNET . ' Missing some example? Ask us for it on our Online Forums, https://www.opclabs.com/forum/index ! You do not have to own ' a commercial license in order to use Online Forums, and we reply to every post. Imports System Imports Microsoft.Extensions.DependencyInjection Imports OpcLabs.BaseLib.DataTypeModel Imports OpcLabs.BaseLib.OperationModel.Generic Imports OpcLabs.EasyOpc.UA Imports OpcLabs.EasyOpc.UA.AddressSpace Imports OpcLabs.EasyOpc.UA.AddressSpace.Standard Imports OpcLabs.EasyOpc.UA.InformationModel Imports OpcLabs.EasyOpc.UA.Plugins.ComplexData Namespace ComplexData._IEasyUAClientComplexData Friend Class ResolveDataType Public Shared Sub Main1() ' Define which server we will work with. Dim endpointDescriptor As UAEndpointDescriptor = "opc.tcp://opcua.demo-this.com:51210/UA/SampleServer" ' or "http://opcua.demo-this.com:51211/UA/SampleServer" (currently not supported) ' or "https://opcua.demo-this.com:51212/UA/SampleServer/" ' Instantiate the client object. Dim client = New EasyUAClient ' Obtain the data type ID. ' ' In many cases, you would be able to obtain the data type ID of a particular node by reading its DataType ' attribute, or easier, by calling the extension method ReadDataType on the IEasyUAClient interface. The sample ' server, however, shows a more advanced approach in which the data type ID refers to an abstract data type, ' and the actual values are then sub-types of this base data type. This abstract data type does not have any ' encodings associated with it and it is therefore not possible to extract its description from the server. ' We therefore use a hard-coded data type ID for one of the sub-types in this example. ' ' The code to obtain the data type ID for given node would normally look like this: ' UANodeId dataTypeId = client.ReadDataType( ' endpointDescriptor, ' "nsu=http://test.org/UA/Data/ ;i=10239"); // [ObjectsFolder]/Data.Static.Scalar.StructureValue ' Dim dataTypeId As UANodeId = "nsu=http://test.org/UA/Data/ ;i=9440" ' ScalarValueDataType ' Get the IEasyUAClientComplexData service from the client. This is needed for advanced complex data ' operations. Dim complexData As IEasyUAClientComplexData = client.GetService(Of IEasyUAClientComplexData) ' Resolve the data type ID to the data type object, containing description of the data type. Dim dataTypeResult As ValueResult(Of DataType) = complexData.ResolveDataType( _ New UAModelNodeDescriptor(endpointDescriptor, dataTypeId), _ UABrowseNames.DefaultBinary) ' Check if the operation succeeded. Use the ThrowIfFailed method instead if you want exception be thrown. If Not dataTypeResult.Succeeded Then Console.WriteLine("*** Failure: {0}", dataTypeResult.ErrorMessageBrief) Exit Sub End If ' The actual data type is in the Value property. ' Display basic information about what we have obtained. Console.WriteLine(dataTypeResult.Value) ' If we want to see the whole hierarchy of the received data type, we can format it with the "V" (verbose) ' specifier. In the debugger, you can view the same by displaying the private DebugView property. Console.WriteLine() Console.WriteLine("{0:V}", dataTypeResult.Value) ' For processing the internals of the data type, refer to examples for GenericData class. ' Example output (truncated): ' 'ScalarValueDataType = structured ' 'ScalarValueDataType = structured ' [BooleanValue] Boolean = primitive(System.Boolean) ' [ByteStringValue] ByteString = primitive(System.Byte[]) ' [ByteValue] Byte = primitive(System.Byte) ' [DateTimeValue] DateTime = primitive(System.DateTime) ' [DoubleValue] Double = primitive(System.Double) ' [EnumerationValue] Int32 = primitive(System.Int32) ' [ExpandedNodeIdValue] ExpandedNodeId = structured ' [ByteString] optional ByteStringNodeId = structured ' [Identifier] ByteString = primitive(System.Byte[]) ' [NamespaceIndex] UInt16 = primitive(System.UInt16) ' [FourByte] optional FourByteNodeId = structured ' [Identifier] UInt16 = primitive(System.UInt16) ' [NamespaceIndex] Byte = primitive(System.Byte) ' [Guid] optional GuidNodeId = structured ' [Identifier] Guid = primitive(System.Guid) ' [NamespaceIndex] UInt16 = primitive(System.UInt16) ' [NamespaceURI] optional CharArray = primitive(System.String) ' [NamespaceURISpecified] switch Bit = primitive(System.Boolean) ' [NodeIdType] switch NodeIdType = enumeration(6) ' TwoByte = 0 ' FourByte = 1 ' Numeric = 2 ' String = 3 ' Guid = 4 ' ByteString = 5 ' [Numeric] optional NumericNodeId = structured ' [Identifier] UInt32 = primitive(System.UInt32) ' [NamespaceIndex] UInt16 = primitive(System.UInt16) ' [ServerIndex] optional UInt32 = primitive(System.UInt32) ' [ServerIndexSpecified] switch Bit = primitive(System.Boolean) ' [String] optional StringNodeId = structured ' [Identifier] CharArray = primitive(System.String) ' [NamespaceIndex] UInt16 = primitive(System.UInt16) ' [TwoByte] optional TwoByteNodeId = structured ' [Identifier] Byte = primitive(System.Byte) ' [FloatValue] Float = primitive(System.Single) ' [GuidValue] Guid = primitive(System.Guid) ' [Int16Value] Int16 = primitive(System.Int16) ' [Int32Value] Int32 = primitive(System.Int32) ' [Int64Value] Int64 = primitive(System.Int64) ' [Integer] Variant = structured ' [ArrayDimensions] optional sequence[*] of Int32 = primitive(System.Int32) ' [ArrayDimensionsSpecified] switch sequence[1] of Bit = primitive(System.Boolean) ' [ArrayLength] length optional Int32 = primitive(System.Int32) ' [ArrayLengthSpecified] switch sequence[1] of Bit = primitive(System.Boolean) ' [Boolean] optional sequence[*] of Boolean = primitive(System.Boolean) ' [Byte] optional sequence[*] of Byte = primitive(System.Byte) End Sub End Class End Namespace
// Shows how to obtain object describing the data type of complex data node with OPC UA Complex Data plug-in. // // Find all latest examples here: https://opclabs.doc-that.com/files/onlinedocs/OPCLabs-OpcStudio/Latest/examples.html . // OPC client and subscriber examples in Object Pascal (Delphi) on GitHub: https://github.com/OPCLabs/Examples-QuickOPC-OP . // Missing some example? Ask us for it on our Online Forums, https://www.opclabs.com/forum/index ! You do not have to own // a commercial license in order to use Online Forums, and we reply to every post. class procedure ResolveDataType.Main; var Client: _EasyUAClient; ComplexData: _EasyUAClientComplexData; DataType: _DataType; DataTypeId: string; DataTypeResult: _ValueResult; EncodingName: _UAQualifiedName; EndpointDescriptor: string; ModelNodeDescriptor: _UAModelNodeDescriptor; begin // Define which server and node we will work with. EndpointDescriptor := //'http://opcua.demo-this.com:51211/UA/SampleServer'; //'https://opcua.demo-this.com:51212/UA/SampleServer/'; 'opc.tcp://opcua.demo-this.com:51210/UA/SampleServer'; // Instantiate the client object Client := CoEasyUAClient.Create; // Obtain the data type ID. // // In many cases, you would be able to obtain the data type ID of a particular node by reading its DataType // attribute. // The sample server, however, shows a more advanced approach in which the data type ID refers to an abstract data type, and // the actual values are then sub-types of this base data type. This abstract data type does not have any encodings // associated with it and it is therefore not possible to extract its description from the server. We therefore use // a hard-coded data type ID for one of the sub-types in this example. DataTypeId := 'nsu=http://test.org/UA/Data/ ;i=9440'; // ScalarValueDataType // Get the IEasyUAClientComplexData service from the client. This is needed for advanced complex data // operations. ComplexData := IInterface(Client.GetServiceByName('OpcLabs.EasyOpc.UA.Plugins.ComplexData.IEasyUAClientComplexData, OpcLabs.EasyOpcUA')) as _EasyUAClientComplexData; // Resolve the data type ID to the data type object, containing description of the data type. ModelNodeDescriptor := CoUAModelNodeDescriptor.Create; ModelNodeDescriptor.EndpointDescriptor.UrlString := EndpointDescriptor; ModelNodeDescriptor.NodeDescriptor.NodeId.ExpandedText := DataTypeId; EncodingName := CoUAQualifiedName.Create; EncodingName.StandardName := 'DefaultBinary'; DataTypeResult := ComplexData.ResolveDataType(ModelNodeDescriptor, EncodingName); if not DataTypeResult.Succeeded then begin WriteLn(Format('*** Failure: %s', [DataTypeResult.ErrorMessageBrief])); Exit; end; // The actual data type is in the Value property. DataType := IUnknown(DataTypeResult.Value) as _DataType; // Display basic information about what we have obtained. WriteLn(DataType.ToString); // If we want to see the whole hierarchy of the received data type, we can format it with the "V" (verbose) // specifier. Writeln; Writeln(DataType.ToString_2['V', nil]); // For processing the internals of the data type, refer to examples for GenericData class. // Example output (truncated): // //ScalarValueDataType = structured // //ScalarValueDataType = structured // [BooleanValue] Boolean = primitive(System.Boolean) // [ByteStringValue] ByteString = primitive(System.Byte[]) // [ByteValue] Byte = primitive(System.Byte) // [DateTimeValue] DateTime = primitive(System.DateTime) // [DoubleValue] Double = primitive(System.Double) // [EnumerationValue] Int32 = primitive(System.Int32) // [ExpandedNodeIdValue] ExpandedNodeId = structured // [ByteString] optional ByteStringNodeId = structured // [Identifier] ByteString = primitive(System.Byte[]) // [NamespaceIndex] UInt16 = primitive(System.UInt16) // [FourByte] optional FourByteNodeId = structured // [Identifier] UInt16 = primitive(System.UInt16) // [NamespaceIndex] Byte = primitive(System.Byte) // [Guid] optional GuidNodeId = structured // [Identifier] Guid = primitive(System.Guid) // [NamespaceIndex] UInt16 = primitive(System.UInt16) // [NamespaceURI] optional CharArray = primitive(System.String) // [NamespaceURISpecified] switch Bit = primitive(System.Boolean) // [NodeIdType] switch NodeIdType = enumeration(6) // TwoByte = 0 // FourByte = 1 // Numeric = 2 // String = 3 // Guid = 4 // ByteString = 5 // [Numeric] optional NumericNodeId = structured // [Identifier] UInt32 = primitive(System.UInt32) // [NamespaceIndex] UInt16 = primitive(System.UInt16) // [ServerIndex] optional UInt32 = primitive(System.UInt32) // [ServerIndexSpecified] switch Bit = primitive(System.Boolean) // [String] optional StringNodeId = structured // [Identifier] CharArray = primitive(System.String) // [NamespaceIndex] UInt16 = primitive(System.UInt16) // [TwoByte] optional TwoByteNodeId = structured // [Identifier] Byte = primitive(System.Byte) // [FloatValue] Float = primitive(System.Single) // [GuidValue] Guid = primitive(System.Guid) // [Int16Value] Int16 = primitive(System.Int16) // [Int32Value] Int32 = primitive(System.Int32) // [Int64Value] Int64 = primitive(System.Int64) // [Integer] Variant = structured // [ArrayDimensions] optional sequence[*] of Int32 = primitive(System.Int32) // [ArrayDimensionsSpecified] switch sequence[1] of Bit = primitive(System.Boolean) // [ArrayLength] length optional Int32 = primitive(System.Int32) // [ArrayLengthSpecified] switch sequence[1] of Bit = primitive(System.Boolean) // [Boolean] optional sequence[*] of Boolean = primitive(System.Boolean) // [Byte] optional sequence[*] of Byte = primitive(System.Byte) end;
Rem Shows how to obtain object describing the data type of complex data node with OPC UA Complex Data plug-in. Rem Rem Find all latest examples here: https://opclabs.doc-that.com/files/onlinedocs/OPCLabs-OpcStudio/Latest/examples.html . Rem OPC client and subscriber examples in VBScript on GitHub: https://github.com/OPCLabs/Examples-QuickOPC-VBScript . Rem Missing some example? Ask us for it on our Online Forums, https://www.opclabs.com/forum/index ! You do not have to own Rem a commercial license in order to use Online Forums, and we reply to every post. Option Explicit ' Define which server we will work with. Dim endpointDescriptor: endpointDescriptor = _ "opc.tcp://opcua.demo-this.com:51210/UA/SampleServer" '"http://opcua.demo-this.com:51211/UA/SampleServer" '"https://opcua.demo-this.com:51212/UA/SampleServer/" ' Instantiate the client object. Dim Client: Set Client = CreateObject("OpcLabs.EasyOpc.UA.EasyUAClient") ' Obtain the data type ID. ' ' In many cases, you would be able to obtain the data type ID of a particular node by reading its DataType ' attribute. ' The sample server, however, shows a more advanced approach in which the data type ID refers to an abstract data type, and ' the actual values are then sub-types of this base data type. This abstract data type does not have any encodings ' associated with it and it is therefore not possible to extract its description from the server. We therefore use ' a hard-coded data type ID for one of the sub-types in this example. Dim dataTypeId: dataTypeId = "nsu=http://test.org/UA/Data/ ;i=9440" ' ScalarValueDataType ' Get the IEasyUAClientComplexData service from the client. This is needed for advanced complex data ' operations. Dim ComplexData: Set ComplexData = _ Client.GetServiceByName("OpcLabs.EasyOpc.UA.Plugins.ComplexData.IEasyUAClientComplexData, OpcLabs.EasyOpcUA") ' Resolve the data type ID to the data type object, containing description of the data type. Dim ModelNodeDescriptor: Set ModelNodeDescriptor = CreateObject("OpcLabs.EasyOpc.UA.InformationModel.UAModelNodeDescriptor") ModelNodeDescriptor.EndpointDescriptor.UrlString = endpointDescriptor ModelNodeDescriptor.NodeDescriptor.NodeId.ExpandedText = dataTypeId Dim EncodingName: Set EncodingName = CreateObject("OpcLabs.EasyOpc.UA.AddressSpace.UAQualifiedName") EncodingName.StandardName = "DefaultBinary" Dim DataTypeResult: Set DataTypeResult = ComplexData.ResolveDataType(ModelNodeDescriptor, EncodingName) If Not DataTypeResult.Succeeded Then WScript.Echo "*** Failure: " & DataTypeResult.Exception.GetBaseException().Message WScript.Quit End If ' The actual data type is in the Value property. Dim DataType: Set DataType = DataTypeResult.Value ' Display basic information about what we have obtained. WScript.Echo DataType ' If we want to see the whole hierarchy of the received data type, we can format it with the "V" (verbose) ' specifier. WScript.Echo WScript.Echo DataType.ToString_2("V", Nothing) ' For processing the internals of the data type, refer to examples for GenericData class. ' Example output (truncated): ' 'ScalarValueDataType = structured ' 'ScalarValueDataType = structured ' [BooleanValue] Boolean = primitive(System.Boolean) ' [ByteStringValue] ByteString = primitive(System.Byte[]) ' [ByteValue] Byte = primitive(System.Byte) ' [DateTimeValue] DateTime = primitive(System.DateTime) ' [DoubleValue] Double = primitive(System.Double) ' [EnumerationValue] Int32 = primitive(System.Int32) ' [ExpandedNodeIdValue] ExpandedNodeId = structured ' [ByteString] optional ByteStringNodeId = structured ' [Identifier] ByteString = primitive(System.Byte[]) ' [NamespaceIndex] UInt16 = primitive(System.UInt16) ' [FourByte] optional FourByteNodeId = structured ' [Identifier] UInt16 = primitive(System.UInt16) ' [NamespaceIndex] Byte = primitive(System.Byte) ' [Guid] optional GuidNodeId = structured ' [Identifier] Guid = primitive(System.Guid) ' [NamespaceIndex] UInt16 = primitive(System.UInt16) ' [NamespaceURI] optional CharArray = primitive(System.String) ' [NamespaceURISpecified] switch Bit = primitive(System.Boolean) ' [NodeIdType] switch NodeIdType = enumeration(6) ' TwoByte = 0 ' FourByte = 1 ' Numeric = 2 ' String = 3 ' Guid = 4 ' ByteString = 5 ' [Numeric] optional NumericNodeId = structured ' [Identifier] UInt32 = primitive(System.UInt32) ' [NamespaceIndex] UInt16 = primitive(System.UInt16) ' [ServerIndex] optional UInt32 = primitive(System.UInt32) ' [ServerIndexSpecified] switch Bit = primitive(System.Boolean) ' [String] optional StringNodeId = structured ' [Identifier] CharArray = primitive(System.String) ' [NamespaceIndex] UInt16 = primitive(System.UInt16) ' [TwoByte] optional TwoByteNodeId = structured ' [Identifier] Byte = primitive(System.Byte) ' [FloatValue] Float = primitive(System.Single) ' [GuidValue] Guid = primitive(System.Guid) ' [Int16Value] Int16 = primitive(System.Int16) ' [Int32Value] Int32 = primitive(System.Int32) ' [Int64Value] Int64 = primitive(System.Int64) ' [Integer] Variant = structured ' [ArrayDimensions] optional sequence[*] of Int32 = primitive(System.Int32) ' [ArrayDimensionsSpecified] switch sequence[1] of Bit = primitive(System.Boolean) ' [ArrayLength] length optional Int32 = primitive(System.Int32) ' [ArrayLengthSpecified] switch sequence[1] of Bit = primitive(System.Boolean) ' [Boolean] optional sequence[*] of Boolean = primitive(System.Boolean) ' [Byte] optional sequence[*] of Byte = primitive(System.Byte)
# Shows how to obtain object describing the data type of complex data node with OPC UA Complex Data plug-in. # # Find all latest examples here: https://opclabs.doc-that.com/files/onlinedocs/OPCLabs-OpcStudio/Latest/examples.html . # OPC client and subscriber examples in Python on GitHub: https://github.com/OPCLabs/Examples-QuickOPC-Python . # Missing some example? Ask us for it on our Online Forums, https://www.opclabs.com/forum/index ! You do not have to own # a commercial license in order to use Online Forums, and we reply to every post. # The QuickOPC package is needed. Install it using "pip install opclabs_quickopc". import opclabs_quickopc # Import .NET namespaces. from Microsoft.Extensions.DependencyInjection import * from System import * from OpcLabs.EasyOpc.UA import * from OpcLabs.EasyOpc.UA.AddressSpace import * from OpcLabs.EasyOpc.UA.AddressSpace.Standard import * #from OpcLabs.EasyOpc.UA.Extensions import * from OpcLabs.EasyOpc.UA.InformationModel import * from OpcLabs.EasyOpc.UA.Plugins.ComplexData import * endpointDescriptor = UAEndpointDescriptor('opc.tcp://opcua.demo-this.com:51210/UA/SampleServer') # or 'http://opcua.demo-this.com:51211/UA/SampleServer' (currently not supported) # or 'https://opcua.demo-this.com:51212/UA/SampleServer/' # Instantiate the client object. client = EasyUAClient() # Obtain the data type ID. # # In many cases, you would be able to obtain the data type ID of a particular node by reading its DataType # attribute, or easier, by calling the extension method ReadDataType on the IEasyUAClient interface. # The sample server, however, shows a more advanced approach in which the data type ID refers to an abstract # data type, and the actual values are then sub-types of this base data type. This abstract data type does not # have any encodings associated with it and it is therefore not possible to extract its description from the # server. We therefore use a hard-coded data type ID for one of the sub-types in this example. # # The code to obtain the data type ID for given node would normally look like this: # dataTypeId = IEasyUAClientExtension2.ReadDataType(client, # endpointDescriptor, # UANodeDescriptor('nsu=http://test.org/UA/Data/ ;i=10239')) # [ObjectsFolder]/Data.Static.Scalar.StructureValue dataTypeId = UANodeId('nsu=http://test.org/UA/Data/ ;i=9440') # ScalarValueDataType # Get the IEasyUAClientComplexData service from the client. This is needed for advanced complex data # operations. complexData = ServiceProviderServiceExtensions.GetService[IEasyUAClientComplexData](client) if complexData is None: print('The client complex data service is not available.') exit() # Resolve the data type ID to the data type object, containing description of the data type. dataTypeResult = IEasyUAClientComplexDataExtension.ResolveDataType(complexData, UAModelNodeDescriptor(endpointDescriptor, UANodeDescriptor(dataTypeId)), UABrowseNames.DefaultBinary) # Check if the operation succeeded. Use the ThrowIfFailed method instead if you want exception be thrown. if not dataTypeResult.Succeeded: print('*** Failure: ', dataTypeResult.ErrorMessageBrief) exit() # The actual data type is in the Value property. # Display basic information about what we have obtained. print(dataTypeResult.Value) # If we want to see the whole hierarchy of the received data type, we can format it with the "V" (verbose) # specifier. In the debugger, you can view the same by displaying the private DebugView property. print() print(String.Format('{0:V}', dataTypeResult.Value)) # For processing the internals of the data type, refer to examples for GenericData class. print() print('Finished.')
Copyright © 2004-2024 CODE Consulting and Development, s.r.o., Plzen. All rights reserved.
Documentation Home, Send Documentation Feedback. Technical Support